import re

# 寻找所有能匹配到的字符，并以列表的方式返回

print(re.findall(r"[as1]", "as1dfsfa2"))

# 关于re.S
"""
    在字符串a中，包含换行符\n，在这种情况下
    如果不使用re.S参数，则只在每一行内进行匹配，如果一行没有，就换下一行重新开始。
    而使用re.S参数以后，正则表达式会将这个字符串作为一个整体，在整体中进行匹配。
    如下要寻找test.*123的数据，因为test和123在不同的行，如果没加re.s的话，他会在每一个进行匹配查找而不是将字符串作为一个整体进行查找
"""
a = """aaatestaa     
aaaa123"""
print(re.findall(r'test.*123', a))
print(re.findall(r'test.*123', a, re.S))

# 关于sub替换字符串
# 查找字符串中所有相匹配的数据进行替换
# sub(要替换的数据，替换成什么，要替换的数据所在的数据)
print(re.sub('php', 'python', 'php是世界上最好的语言——php'))

# 对字符串进行分割
s = "itcase,java:php-php3;html"
print(re.split(r",", s))  # 以,号进行分割
print(re.split(r",|:|-|;", s))  # 以,或者：或者-或者;进行分割
print(re.split(r",|:|-|%", s))  # 找不到的分隔符就忽略

# 贪婪与非贪婪
# python里的数量词默认是贪婪的，总是尝试尽可能的匹配更多的字符。python中使用?号关闭贪婪模式
print(re.match(r"aa\d+", "aa2323"))  # 会尽可能多的去匹配\d
print(re.match(r"aa\d+?", "aa2323"))  # 尽可能少的去匹配\d

s = "this is a number 234-235-22-423"
# 1.贪婪模式
resule = re.match(r"(.+)(\d+-\d+-\d+-\d)", s)  # 我们本想数字和字母拆解成两个分组
print(resule.groups())  # ('this is a number 23', '4-235-22-4')但我们发现输出的结果中23的数字竟然被弄到前面去了

# 因为+它会尽可能多的进行匹配，\d，只需要一个4就能满足，所以前面就尽可能多的匹配
# 2.关闭贪婪模式
# 在数量词后面加上 ?，进入非贪婪模式，尽可能少的进行匹配
result = re.match(r"(.+?)(\d+-\d+-\d+-\d)", s)
print(result.groups())  # ('this is a number ', '234-235-22-4')
